package dominio;
import java.util.Map;

public class Nivel {
	String nombre;
	Tablero  tablero;
	int puntajeMinimo;
	int maxNroMovimientosARealizar;
	Map<TipoObjetivo, Boolean> objetivos; // true si lo cumplio, false en caso contrario
	Dificultad dificultad;
	
	public Nivel(String elNombre,Tablero t){
		this.nombre = elNombre;
		this.tablero = t;
	}
	
	public Nivel(String elNombre){
		this.nombre = elNombre;
	}
	
	public Nivel(String elNombre, int cantMovimientosMaximo, int elPuntajeMinimo, Tablero elTablero){
		this.nombre = elNombre;
		this.maxNroMovimientosARealizar = cantMovimientosMaximo;
		this.puntajeMinimo = elPuntajeMinimo;
		this.tablero = elTablero;
	}
	
	public Nivel(String elNombre, int cantMovimientosMaximo, int elPuntajeMinimo, Tablero elTablero,Map<TipoObjetivo, Boolean> misObjetivos){
		this.nombre = elNombre;
		this.maxNroMovimientosARealizar = cantMovimientosMaximo;
		this.puntajeMinimo = elPuntajeMinimo;
		this.tablero = elTablero;
		this.objetivos = misObjetivos;
	}
	
	public Tablero getTablero() {
		return tablero;
	}
	public Dificultad getDificultad() {
		return dificultad;
	}
	public void setDificultad(Dificultad dificultad) {
		this.dificultad = dificultad;
	}
	public void setTablero(Tablero tablero) {
		this.tablero = tablero;
	}
	
	public int getPuntajeMinimo() {
		return puntajeMinimo;
	}
	public void setPuntajeMinimo(int puntajeMinimo) {
		this.puntajeMinimo = puntajeMinimo;
	}
	public int getMaxNroMovimientosARealizar() {
		return maxNroMovimientosARealizar;
	}
	public void setMaxNroMovimientosARealizar(int maxNroMovimientosARealizar) {
		this.maxNroMovimientosARealizar = maxNroMovimientosARealizar;
	}
	
	public boolean puntajeEsMayorAlMinimo(Jugador j){
		return(j.getPuntaje() > this.getPuntajeMinimo());
	}
	
	public boolean hizoMaxNumeroDeMovimientos(Jugador j){
		return (this.getMaxNroMovimientosARealizar() <= j.getCantMovimientosRealizados());
	}
	
	public boolean cumplioTodosLosObjetivos(){
		boolean cumplio = true;
		for(Boolean v : this.getObjetivos().values()){
			cumplio = cumplio && v;
		}
		return cumplio;
	}
	
	public Map<TipoObjetivo, Boolean> getObjetivos() {
		return objetivos;
	}
	public void setObjetivos(Map<TipoObjetivo, Boolean> objetivos) {
		this.objetivos = objetivos;
	}
	
	public boolean cumpleRequisitosParaSiguienteNivel(Jugador j){
		return (!hizoMaxNumeroDeMovimientos(j) && cumplioTodosLosObjetivos() && puntajeEsMayorAlMinimo(j));
	}
	
	public void mostrarInformacionResultado(Jugador j){
		System.out.println(j.getCantMovimientosRealizados());
		System.out.println(j.getPuntaje());
	}
}
